home *** CD-ROM | disk | FTP | other *** search
/ Visual Cafe 3 / Visual Cafe 3.ISO / Vcafe / JFC.bin / RTFAttributes.java < prev    next >
Text File  |  1998-06-30  |  12KB  |  418 lines

  1. /*
  2.  * @(#)RTFAttributes.java    1.3 98/01/13
  3.  * 
  4.  * Copyright (c) 1997 Sun Microsystems, Inc. All Rights Reserved.
  5.  * 
  6.  * This software is the confidential and proprietary information of Sun
  7.  * Microsystems, Inc. ("Confidential Information").  You shall not
  8.  * disclose such Confidential Information and shall use it only in
  9.  * accordance with the terms of the license agreement you entered into
  10.  * with Sun.
  11.  * 
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  13.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  14.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  15.  * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
  16.  * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
  17.  * THIS SOFTWARE OR ITS DERIVATIVES.
  18.  * 
  19.  */
  20. package com.sun.java.swing.text.rtf;
  21.  
  22. import com.sun.java.swing.text.StyleConstants;
  23. import com.sun.java.swing.text.AttributeSet;
  24. import com.sun.java.swing.text.MutableAttributeSet;
  25. import com.sun.java.swing.text.TabStop;
  26. import java.util.*;
  27. import java.io.IOException;
  28.  
  29. class RTFAttributes
  30. {
  31.     static RTFAttribute attributes[];
  32.  
  33.     static {
  34.         Vector a = new Vector();
  35.     int CHR = RTFAttribute.D_CHARACTER;
  36.     int PGF = RTFAttribute.D_PARAGRAPH;
  37.     int SEC = RTFAttribute.D_SECTION;
  38.     int DOC = RTFAttribute.D_DOCUMENT;
  39.     int PST = RTFAttribute.D_META;
  40.     Boolean True = new Boolean(true);
  41.     Boolean False = new Boolean(false);
  42.  
  43.     a.addElement(new BooleanAttribute(CHR, StyleConstants.Italic, "i"));
  44.     a.addElement(new BooleanAttribute(CHR, StyleConstants.Bold, "b"));
  45.     a.addElement(new BooleanAttribute(CHR, StyleConstants.Underline, "ul"));
  46.     a.addElement(NumericAttribute.NewTwips(PGF, StyleConstants.LeftIndent, "li",
  47.                     0f, 0));
  48.     a.addElement(NumericAttribute.NewTwips(PGF, StyleConstants.RightIndent, "ri",
  49.                     0f, 0));
  50.     a.addElement(NumericAttribute.NewTwips(PGF, StyleConstants.FirstLineIndent, "fi",
  51.                     0f, 0));
  52.  
  53.     a.addElement(new AssertiveAttribute(PGF, StyleConstants.Alignment,
  54.                         "ql", StyleConstants.ALIGN_LEFT));
  55.     a.addElement(new AssertiveAttribute(PGF, StyleConstants.Alignment,
  56.                         "qr", StyleConstants.ALIGN_RIGHT));
  57.     a.addElement(new AssertiveAttribute(PGF, StyleConstants.Alignment,
  58.                         "qc", StyleConstants.ALIGN_CENTER));
  59.     a.addElement(new AssertiveAttribute(PGF, StyleConstants.Alignment,
  60.                         "qj", StyleConstants.ALIGN_JUSTIFIED));
  61.     a.addElement(NumericAttribute.NewTwips(PGF, StyleConstants.SpaceAbove,
  62.                     "sa", 0));
  63.     a.addElement(NumericAttribute.NewTwips(PGF, StyleConstants.SpaceBelow,
  64.                     "sb", 0));
  65.  
  66.     a.addElement(new AssertiveAttribute(PST, RTFReader.TabAlignmentKey,
  67.                         "tqr", TabStop.ALIGN_RIGHT));
  68.     a.addElement(new AssertiveAttribute(PST, RTFReader.TabAlignmentKey,
  69.                         "tqc", TabStop.ALIGN_CENTER));
  70.     a.addElement(new AssertiveAttribute(PST, RTFReader.TabAlignmentKey,
  71.                         "tqdec", TabStop.ALIGN_DECIMAL));
  72.              
  73.  
  74.     a.addElement(new AssertiveAttribute(PST, RTFReader.TabLeaderKey,
  75.                         "tldot", TabStop.LEAD_DOTS));
  76.     a.addElement(new AssertiveAttribute(PST, RTFReader.TabLeaderKey,
  77.                         "tlhyph", TabStop.LEAD_HYPHENS));
  78.     a.addElement(new AssertiveAttribute(PST, RTFReader.TabLeaderKey,
  79.                         "tlul", TabStop.LEAD_UNDERLINE));
  80.     a.addElement(new AssertiveAttribute(PST, RTFReader.TabLeaderKey,
  81.                         "tlth", TabStop.LEAD_THICKLINE));
  82.     a.addElement(new AssertiveAttribute(PST, RTFReader.TabLeaderKey,
  83.                         "tleq", TabStop.LEAD_EQUALS));
  84.  
  85.     /* The following aren't actually recognized by Swing */
  86.     a.addElement(new BooleanAttribute(CHR, Constants.Caps,      "caps"));
  87.     a.addElement(new BooleanAttribute(CHR, Constants.Outline,   "outl"));
  88.     a.addElement(new BooleanAttribute(CHR, Constants.SmallCaps, "scaps"));
  89.     a.addElement(new BooleanAttribute(CHR, Constants.Shadow,    "shad"));
  90.     a.addElement(new BooleanAttribute(CHR, Constants.Hidden,    "v"));
  91.     a.addElement(new BooleanAttribute(CHR, Constants.Strikethrough,
  92.                            "strike"));
  93.     a.addElement(new BooleanAttribute(CHR, Constants.Deleted,
  94.                            "deleted"));
  95.  
  96.  
  97.     
  98.     a.addElement(new AssertiveAttribute(DOC, "saveformat", "defformat", "RTF"));
  99.     a.addElement(new AssertiveAttribute(DOC, "landscape", "landscape"));
  100.  
  101.     a.addElement(NumericAttribute.NewTwips(DOC, Constants.PaperWidth,
  102.                            "paperw", 12240));
  103.     a.addElement(NumericAttribute.NewTwips(DOC, Constants.PaperHeight,
  104.                            "paperh", 15840));
  105.     a.addElement(NumericAttribute.NewTwips(DOC, Constants.MarginLeft,
  106.                            "margl",  1800));
  107.     a.addElement(NumericAttribute.NewTwips(DOC, Constants.MarginRight,
  108.                            "margr",  1800));
  109.     a.addElement(NumericAttribute.NewTwips(DOC, Constants.MarginTop,
  110.                            "margt",  1440));
  111.     a.addElement(NumericAttribute.NewTwips(DOC, Constants.MarginBottom,
  112.                            "margb",  1440));
  113.     a.addElement(NumericAttribute.NewTwips(DOC, Constants.GutterWidth,
  114.                            "gutter", 0));
  115.  
  116.     a.addElement(new AssertiveAttribute(PGF, Constants.WidowControl,
  117.                         "nowidctlpar", False));
  118.     a.addElement(new AssertiveAttribute(PGF, Constants.WidowControl,
  119.                         "widctlpar", True));
  120.     a.addElement(new AssertiveAttribute(DOC, Constants.WidowControl,
  121.                         "widowctrl", True));
  122.     
  123.  
  124.     RTFAttribute[] attrs = new RTFAttribute[a.size()];
  125.     a.copyInto(attrs);
  126.     attributes = attrs;
  127.     }    
  128.  
  129.     static Dictionary attributesByKeyword()
  130.     {
  131.         Dictionary d = new Hashtable(attributes.length);
  132.     int i, m;
  133.  
  134.     m = attributes.length;
  135.     for(i = 0; i < m; i++)
  136.         d.put(attributes[i].rtfName(), attributes[i]);
  137.  
  138.     return d;
  139.     }
  140.  
  141.     /************************************************************************/
  142.     /************************************************************************/
  143.  
  144.     static abstract class GenericAttribute 
  145.     {
  146.         int domain;
  147.     Object swingName;
  148.     String rtfName;
  149.     
  150.     protected GenericAttribute(int d,Object s, String r)
  151.     {
  152.         domain = d;
  153.         swingName = s;
  154.         rtfName = r;
  155.     }
  156.  
  157.     public int domain() { return domain; }
  158.     public Object swingName() { return swingName; }
  159.     public String rtfName() { return rtfName; }
  160.     
  161.     abstract boolean set(MutableAttributeSet target);
  162.     abstract boolean set(MutableAttributeSet target, int parameter);
  163.     abstract boolean setDefault(MutableAttributeSet target);
  164.     
  165.     public boolean write(AttributeSet source,
  166.                  RTFGenerator target,
  167.                  boolean force)
  168.         throws IOException
  169.     {
  170.         return writeValue(source.getAttribute(swingName), target, force);
  171.     }
  172.  
  173.     public boolean writeValue(Object value, RTFGenerator target,
  174.                   boolean force)
  175.         throws IOException 
  176.     {
  177.         return false;
  178.     }
  179.     }
  180.  
  181.     static class BooleanAttribute 
  182.         extends GenericAttribute
  183.     implements RTFAttribute
  184.     {
  185.         boolean rtfDefault;
  186.     boolean swingDefault;
  187.  
  188.     protected static final Boolean True = new Boolean(true);
  189.     protected static final Boolean False = new Boolean(false);
  190.     
  191.     public BooleanAttribute(int d, Object s,
  192.                 String r, boolean ds, boolean dr)
  193.     {
  194.         super(d, s, r);
  195.         swingDefault = ds;
  196.         rtfDefault = dr;
  197.     }
  198.  
  199.     public BooleanAttribute(int d, Object s, String r)
  200.     {
  201.         super(d, s, r);
  202.         
  203.         swingDefault = false;
  204.         rtfDefault = false;
  205.     }
  206.  
  207.     public boolean set(MutableAttributeSet target)
  208.     {
  209.         /* TODO: There's some ambiguity about whenther this should
  210.            *set* or *toggle* the attribute. */
  211.         target.addAttribute(swingName, True);
  212.  
  213.         return true;  /* true indicates we were successful */
  214.     }
  215.  
  216.     public boolean set(MutableAttributeSet target, int parameter)
  217.     {
  218.         /* See above note in the case that parameter==1 */
  219.         Boolean value = ( parameter != 0 ? True : False );
  220.         
  221.         target.addAttribute(swingName, value);
  222.         
  223.         return true; /* true indicates we were successful */
  224.     }
  225.     
  226.     public boolean setDefault(MutableAttributeSet target)
  227.     {
  228.         if (swingDefault != rtfDefault ||
  229.         ( target.getAttribute(swingName) != null ) )
  230.           target.addAttribute(swingName, new Boolean(rtfDefault));
  231.         return true;
  232.     }
  233.  
  234.     public boolean writeValue(Object o_value,
  235.                   RTFGenerator target,
  236.                   boolean force)
  237.         throws IOException
  238.     {
  239.         Boolean val;
  240.  
  241.         if (o_value == null)
  242.           val = new Boolean(swingDefault);
  243.         else
  244.           val = (Boolean)o_value;
  245.         
  246.         if (force || (val.booleanValue() != rtfDefault)) {
  247.         if (val.booleanValue()) {
  248.             target.writeControlWord(rtfName);
  249.         } else {
  250.             target.writeControlWord(rtfName, 0);
  251.         }
  252.         }
  253.         return true;
  254.     }
  255.     }
  256.  
  257.  
  258.     static class AssertiveAttribute
  259.         extends GenericAttribute
  260.     implements RTFAttribute
  261.     {
  262.     Object swingValue;
  263.  
  264.     public AssertiveAttribute(int d, Object s, String r)
  265.     {
  266.         super(d, s, r);
  267.         swingValue = new Boolean(true);
  268.     }
  269.  
  270.     public AssertiveAttribute(int d, Object s, String r, Object v)
  271.     {
  272.         super(d, s, r);
  273.         swingValue = v;
  274.     }
  275.  
  276.     public AssertiveAttribute(int d, Object s, String r, int v)
  277.     {
  278.         super(d, s, r);
  279.         swingValue = new Integer(v);
  280.     }
  281.     
  282.     public boolean set(MutableAttributeSet target)
  283.     {
  284.         if (swingValue == null)
  285.             target.removeAttribute(swingName);
  286.         else
  287.             target.addAttribute(swingName, swingValue);
  288.         
  289.         return true;
  290.     }
  291.     
  292.     public boolean set(MutableAttributeSet target, int parameter)
  293.     {
  294.         return false;
  295.     }
  296.     
  297.     public boolean setDefault(MutableAttributeSet target)
  298.     {
  299.         target.removeAttribute(swingName);
  300.         return true;
  301.     }
  302.  
  303.     public boolean writeValue(Object value,
  304.                   RTFGenerator target,
  305.                   boolean force)
  306.         throws IOException
  307.         {
  308.         if (value == null) {
  309.         return ! force;
  310.         }
  311.  
  312.         if (value.equals(swingValue)) {
  313.         target.writeControlWord(rtfName);
  314.         return true;
  315.         }
  316.         
  317.         return ! force;
  318.     }
  319.     }
  320.  
  321.  
  322.     static class NumericAttribute 
  323.         extends GenericAttribute
  324.     implements RTFAttribute
  325.     {
  326.     int rtfDefault;
  327.     Number swingDefault;
  328.     float scale;
  329.     
  330.     protected NumericAttribute(int d, Object s, String r)
  331.     {
  332.         super(d, s, r);
  333.         rtfDefault = 0;
  334.         swingDefault = null;
  335.         scale = 1f;
  336.     }
  337.  
  338.     public NumericAttribute(int d, Object s,
  339.                 String r, int ds, int dr)
  340.     {
  341.         this(d, s, r, new Integer(ds), dr, 1f);
  342.     }
  343.  
  344.     public NumericAttribute(int d, Object s,
  345.                 String r, Number ds, int dr, float sc)
  346.     {
  347.         super(d, s, r);
  348.         swingDefault = ds;
  349.         rtfDefault = dr;
  350.         scale = sc;
  351.     }
  352.  
  353.     public static NumericAttribute NewTwips(int d, Object s, String r,
  354.                         float ds, int dr)
  355.     {
  356.         return new NumericAttribute(d, s, r, new Float(ds), dr, 20f);
  357.     }
  358.  
  359.     public static NumericAttribute NewTwips(int d, Object s, String r,
  360.                         int dr)
  361.     {
  362.         return new NumericAttribute(d, s, r, null, dr, 20f);
  363.     }
  364.  
  365.     public boolean set(MutableAttributeSet target)
  366.     {
  367.         return false;
  368.     }
  369.  
  370.     public boolean set(MutableAttributeSet target, int parameter)
  371.     {
  372.         Number swingValue;
  373.  
  374.         if (scale == 1f)
  375.             swingValue = new Integer(parameter);
  376.         else
  377.             swingValue = new Float(parameter / scale);
  378.         target.addAttribute(swingName, swingValue);
  379.         return true;
  380.     }
  381.  
  382.     public boolean setDefault(MutableAttributeSet target)
  383.     {
  384.         Number old = (Number)target.getAttribute(swingName);
  385.         if (old == null)
  386.             old = swingDefault;
  387.         if (old != null && (
  388.             (scale == 1f && old.intValue() == rtfDefault) ||
  389.             ((int)Math.round(old.floatValue() * scale) == rtfDefault)
  390.            ))
  391.             return true;
  392.         set(target, rtfDefault);
  393.         return true;
  394.     }
  395.  
  396.     public boolean writeValue(Object o_value,
  397.                   RTFGenerator target,
  398.                   boolean force)
  399.         throws IOException
  400.     {
  401.         Number value = (Number)o_value;
  402.         if (value == null)
  403.             value = swingDefault;
  404.         if (value == null) {
  405.         /* TODO: What is the proper behavior if the Swing object does
  406.            not specify a value, and we don't know its default value?
  407.            Currently we pretend that the RTF default value is
  408.            equivalent (probably a workable assumption) */
  409.         return true;
  410.         }
  411.         int int_value = (int)Math.round(value.floatValue() * scale);
  412.         if (force || (int_value != rtfDefault))
  413.             target.writeControlWord(rtfName, int_value);
  414.         return true;
  415.     }
  416.     }
  417. }
  418.